//package com.piesat.quake.business.device.mqtt.decoder;
//
//import com.piesat.quake.business.device.bis.ParseConfig;
//import com.piesat.quake.business.device.model.BaseModel;
//import com.piesat.quake.business.device.model.ConfigurationUpdate;
//import com.piesat.quake.business.device.mqtt.DataType;
//import com.piesat.quake.business.device.mqtt.param.ClassParseParam;
//import com.piesat.quake.business.device.mqtt.param.ListParseParam;
//import com.piesat.quake.business.device.mqtt.param.ParseParam;
//import com.piesat.quake.business.device.mqtt.writer.Writer;
//
//import org.apache.mina.filter.codec.demux.MessageDecoder;
//
//import java.lang.reflect.Field;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import io.netty.buffer.ByteBuf;
//import io.netty.buffer.Unpooled;
//
///**
// * MQTT数据编码器
// *
// * @author Gersy
// * @date 2023/2/6
// * @since 1.0
// */
//public class MessageEncoder {
//
//    public static void main(String[] args) {
//        Class<BaseModel> aClass = BaseModel.class;
//        Field[] fields = aClass.getDeclaredFields();
//        Map<String, Field> fieldMap = new HashMap<>();
//        for (Field field : fields) {
//            fieldMap.put(field.getName(), field);
//        }
//        MessageEncoder messageEncoder = new MessageEncoder();
//        List<ParseParam> passageway = ParseConfig.getInstance().get("passageway");
//        ConfigurationUpdate.Passageway data = new ConfigurationUpdate.Passageway();
//        ArrayList<ConfigurationUpdate.Passageway.PassagewayBlock> passagewayBlocks = new ArrayList<>();
//        ConfigurationUpdate.Passageway.PassagewayBlock passagewayBlock = new ConfigurationUpdate.Passageway.PassagewayBlock();
//        passagewayBlock.setBiasVoltage(1);
//        passagewayBlock.setId((byte) 1);
//        passagewayBlock.setLength(1);
//        passagewayBlock.setNextNumber((byte) 1);
//        passagewayBlock.setNumber((byte) 1);
//        passagewayBlock.setRealtimeThreshold(1);
//        passagewayBlock.setSensitivity(1);
//        passagewayBlock.setThreshold(1);
//        passagewayBlocks.add(passagewayBlock);
//        passagewayBlocks.add(passagewayBlock);
//        passagewayBlocks.add(passagewayBlock);
//        passagewayBlocks.add(passagewayBlock);
//        data.setPassagewayBlocks(passagewayBlocks);
//        data.setLength(111);
//
//        byte[] encode = messageEncoder.encode(data, passageway);
//        int length = encode.length;
//        System.out.println(encode);
//        MessageDecoder messageDecoder = new MessageDecoder();
//        ConfigurationUpdate.Passageway decode = messageDecoder.decode(ConfigurationUpdate.Passageway.class, encode, passageway, null);
//        System.out.println(decode);
//    }
//
//    public int getLength(Object data){
//        Class<?> aClass = data.getClass();
//        Field[] declaredFields = aClass.getDeclaredFields();
//        for (Field declaredField : declaredFields) {
////            declaredField.
//        }
//        return 0;
//    }
//
//    public <T> void encodeList(ByteBuf byteBuf, List<T> data, List<? extends ParseParam> parseParams) {
//        int size = data.size();
//        if (size == 0) {
//            return;
//        }
//        for (T datum : data) {
//            encode(byteBuf, datum, parseParams);
//        }
//    }
//
//    public <T> byte[] encode(T data, List<? extends ParseParam> parseParams, Map<String, Field> fieldMap) {
//        ByteBuf byteBuf = getByteBuf(parseParams);
//        encode(byteBuf, data, parseParams, fieldMap);
//        return byteBuf.array();
//    }
//
//    public <T> byte[] encode(T data, List<? extends ParseParam> parseParams) {
//        return encode( data, parseParams,null);
//    }
//
//    private <T> void encode(ByteBuf byteBuf, T data, List<? extends ParseParam> parseParams) {
//        encode(byteBuf, data, parseParams, null);
//    }
//
//    /**
//     * 将数据按格式编码
//     *
//     * @param data 待编码的数据
//     * @param parseParams 编码参数
//     * @param <T> 数据泛型
//     * @return 编码好的二进制文件
//     */
//    private <T> void encode(ByteBuf byteBuf, T data, List<? extends ParseParam> parseParams, Map<String, Field> fieldMap) {
//        try {
//            Class<?> clazz = data.getClass();
//            for (ParseParam parseParam : parseParams) {
//                Field field = getField(clazz, fieldMap, parseParam.field);
//                field.setAccessible(true);
//                if (parseParam instanceof ClassParseParam) {
//                    Object fieldData = field.get(data);
//                    if (fieldData == null) {
//                        continue;
//                    }
//                    ClassParseParam param = (ClassParseParam) parseParam;
//                    if (param instanceof ListParseParam) {
//                        encodeList(byteBuf, (List<?>) fieldData, param.parseParams);
//                    } else {
//                        encode(byteBuf, fieldData, param.parseParams);
//                    }
//                } else {
//                    Writer writer = DataType.getWriter(parseParam.type);
//                    writer.write(byteBuf, parseParam, field.get(data));
//                }
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//            throw new RuntimeException("解析失败：" + e.getMessage());
//        }
//    }
//
//    private Field getField(Class<?> clazz, Map<String, Field> fieldMap, Field fieldName) throws NoSuchFieldException {
//        Field field = null;
//        if (fieldMap != null) {
//            field = fieldMap.get(fieldName);
//        }
//        if (field == null) {
////            field = clazz.getDeclaredField(fieldName);
//        }
//        return field;
//    }
//
//    private ByteBuf getByteBuf(List<? extends ParseParam> parseParams) {
//        return getByteBuf(parseParams, 1);
//    }
//
//    private ByteBuf getByteBuf(List<? extends ParseParam> parseParams, int size) {
//        int capacity = 0;
//        for (ParseParam parseParam : parseParams) {
//            capacity += parseParam.getLength();
//        }
////        return ByteBufAllocator.DEFAULT.heapBuffer(capacity * size);
////        return Unpooled.buffer(capacity * size);
//        return Unpooled.buffer(4096);
//    }
//
//    /**
//     * 将数据按格式编码
//     *
//     * @param data 待编码的数据
//     * @param parseParams 编码参数
//     * @return 编码好的二进制文件
//     */
//    public byte[] encode(Map<String, Object> data, List<? extends ParseParam> parseParams) {
//        ByteBuf byteBuf = getByteBuf(parseParams);
//        for (ParseParam parseParam : parseParams) {
//            Writer writer = DataType.getWriter(parseParam.type);
//            writer.write(byteBuf, parseParam, data.get(parseParam.field));
//        }
//        return byteBuf.array();
//    }
//
//}
